package com.xoms.front.service;

import java.util.Map;

import com.alipay.api.AlipayApiException;
import com.alipay.api.response.AlipayTradeCancelResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.xoms.front.controller.res.BaseResult;
import com.xoms.front.controller.res.ObjectResult;
import com.xoms.front.controller.res.bean.ROrderStatusBean;
import com.xoms.front.service.exception.ServiceException;

/**
 * 支付业务层
 * 
 * @author stallmandu
 */
public interface PayService {

	/**
	 * 微信扫码支付
	 * 
	 * @param outTradeNo
	 *            商户订单号，需要保证不重复
	 * @param spbill_create_ip
	 *            终端IP 调用微信支付API的机器IP
	 * @return
	 */
	public ObjectResult<String> wxScanQrcode(String outTradeNo, String spbill_create_ip);

	/**
	 * 微信刷卡支付
	 * 
	 * @param outTradeNo
	 *            商户订单号，需要保证不重复
	 * @param spbill_create_ip
	 *            终端IP 调用微信支付API的机器IP
	 * @param authCode
	 *            授权码 设备读取用户微信中的条码或者二维码信息
	 * @return
	 */
	public ObjectResult<String> wxScanAuthCode(String outTradeNo, String spbill_create_ip, String authCode);

	/**
	 * 支付宝扫码支付
	 * 
	 * @param outTradeNo
	 * @return
	 */
	public ObjectResult<String> aliScanQrcode(String outTradeNo);

	/**
	 * 支付宝当面付
	 * 
	 * @param outTradeNo
	 *            商户订单号，需要保证不重复
	 * @param authCode
	 *            用户付款码，25~30开头的长度为16~24位的数字，实际字符串长度以开发者获取的付款码长度为准
	 * @param subject
	 *            订单标题 烟酒
	 * @param totalAmount
	 *            订单金额
	 */
	public BaseResult aliScanAuthCode(String outTradeNo, String authCode);

	/**
	 * 支付宝交易查询接口
	 * 
	 * @param outTradeNo
	 *            商户订单号，需要保证不重复 20150320010101006
	 * @param tradeNo
	 *            支付宝交易号 2018052521001004870250121509
	 * @return
	 */
	public ObjectResult<AlipayTradeQueryResponse> aliTradeQuery(String outTradeNo, String tradeNo);

	/**
	 * 支付宝交易撤销接口
	 * 
	 * @param outTradeNo
	 *            商户订单号，需要保证不重复 20150320010101006
	 * @param tradeNo
	 *            支付宝交易号 2018052521001004870250121509
	 * @return
	 */
	public ObjectResult<AlipayTradeCancelResponse> aliTradeCancel(String outTradeNo, String tradeNo);

	/**
	 * 微信app支付，异步通知处理--钱包充值
	 * 
	 * @param resStr
	 *            微信服务器通知支付结果
	 * @return
	 */
	String wechatPayCallback(String resStr) throws ServiceException;

	/**
	 * 支付宝支付，异步通知处理--钱包充值
	 * 
	 * @param params
	 *            从支付宝服务器发过来的通知参数
	 * @return
	 * @throws ServiceException
	 * @throws AlipayApiException
	 */
	String aliPayCallback(Map<String, String> params) throws ServiceException, AlipayApiException;

	/**
	 * 查询订单支付状态
	 * 
	 * @param orderNo
	 *            订单编号
	 * @return
	 */
	public ObjectResult<ROrderStatusBean> queryOrderStatus(String orderNo);

}
